--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nomadnet/ui/textui/Log.py 07ba36a21cf2da2e2eddaf82e282b4da7ab63533 (07ba36a2) Text, 3.95 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787itertools
Tff7b72import T7ee787mmap
Tff7b72import T7ee787urwid
Tff7b72import T7ee787nomadnet
Tff7b72class T56d364LogDisplayShortcutsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787urwid
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshortcutbarTa5d6ff"Tb4b4b4)
Tff7b72class T56d364LogDisplayTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffshortcuts_display Tff7b72= Te6edf3LogDisplayShortcutsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Tff7b72None
Tf0883e@property
Tff7b72def Td2a8fflog_termTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffwidget
Tff7b72def Td2a8ffshowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3log_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4)
Tff7b72def Td2a8ffkillTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidgetTff7b72.Td2a8ffterminateTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Tff7b72None
Tff7b72def Td2a8ffshortcutsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffshortcuts_display
Tff7b72class T56d364LogTerminalTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8fflog_term Tff7b72= Te6edf3urwidTff7b72.Td2a8ffTerminalTb4b4b4(
Tb4b4b4(Ta5d6ff"Ta5d6fftailTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-fn50Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fflogfilepathTb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4,
Te6edf3escape_sequenceTff7b72=Ta5d6ff"Ta5d6ffupTa5d6ff"Tb4b4b4,
Te6edf3main_loopTff7b72=Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffloopTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Tff7b72selfTff7b72.Td2a8fflog_termTb4b4b4)
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwidgetTb4b4b4)
Tff7b72def Td2a8ffterminateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflog_termTff7b72.Td2a8ffterminateTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffupTa5d6ff"Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffframeTff7b72.Td2a8fffocus_position Tff7b72= Ta5d6ff"Ta5d6ffheaderTa5d6ff"
Tff7b72return Tffa657superTb4b4b4(Te6edf3LogTerminalTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffkeypressTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)
Tff7b72class T56d364LogTailTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8fflog_tail Tff7b72= Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Te6edf3tailTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fflogfilepathTb4b4b4, T79c0ff50Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflog Tff7b72= Te6edf3urwidTff7b72.Td2a8ffScrollableTb4b4b4(Tff7b72selfTff7b72.Td2a8fflog_tailTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflogTff7b72.Td2a8ffset_scrollposTb4b4b4(Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflog_scrollbar Tff7b72= Te6edf3urwidTff7b72.Td2a8ffScrollBarTb4b4b4(Tff7b72selfTff7b72.Td2a8fflogTb4b4b4)
T8b949e# We have this here because ui.textui.Main depends on this field to kill it
Tff7b72selfTff7b72.Td2a8fflog_term Tff7b72= Tff7b72None
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTff7b72.Td2a8fflog_scrollbarTb4b4b4)
Tff7b72def Td2a8ffterminateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8fflog_widgetTb4b4b4(Te6edf3appTb4b4b4, Te6edf3platformTff7b72=Te6edf3sysTff7b72.Td2a8ffplatformTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3platform Tff7b72== Ta5d6ff"Ta5d6ffwin32Ta5d6ff"Tb4b4b4:
Tff7b72return Te6edf3LogTailTb4b4b4(Te6edf3appTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3LogTerminalTb4b4b4(Te6edf3appTb4b4b4)
T8b949e# https://stackoverflow.com/a/34029605/3713120
Tff7b72def Td2a8ff_tailTb4b4b4(Te6edf3f_nameTb4b4b4, Te6edf3nTb4b4b4, Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffskip_back_linesTb4b4b4(Te6edf3mmTb4b4b4: Te6edf3mmapTff7b72.Td2a8ffmmapTb4b4b4, Te6edf3numlinesTb4b4b4: Tffa657intTb4b4b4, Te6edf3startidxTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e'''Factored out to simplify handling of n and offset'''
Tff7b72for Te6edf3_ Tff7b72in Te6edf3itertoolsTff7b72.Td2a8ffrepeatTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3numlinesTb4b4b4)Tb4b4b4:
Te6edf3startidx Tff7b72= Te6edf3mmTff7b72.Td2a8ffrfindTb4b4b4(Ta5d6ffbTa5d6ff'Tffea00\nTa5d6ff'Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3startidxTb4b4b4)
Tff7b72if Te6edf3startidx Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72break
Tff7b72return Te6edf3startidx
T8b949e# Open file in binary mode
Tff7b72with Tffa657openTb4b4b4(Te6edf3f_nameTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3binfTb4b4b4, Te6edf3mmapTff7b72.Td2a8ffmmapTb4b4b4(Te6edf3binfTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3accessTff7b72=Te6edf3mmapTff7b72.Td2a8ffACCESS_READTb4b4b4) Tff7b72as Te6edf3mmTb4b4b4:
T8b949e# len(mm) - 1 handles files ending w/newline by getting the prior line
Te6edf3startofline Tff7b72= Te6edf3skip_back_linesTb4b4b4(Te6edf3mmTb4b4b4, Te6edf3offsetTb4b4b4, Tffa657lenTb4b4b4(Te6edf3mmTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3startofline Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4] T8b949e# Offset lines consumed whole file, nothing to return
T8b949e# If using a generator function (yield-ing, see below),
T8b949e# this should be a plain return, no empty list
Te6edf3endoflines Tff7b72= Te6edf3startofline Tff7b72+ T79c0ff1 T8b949e# Slice end to omit offset lines
T8b949e# Find start of lines to capture (add 1 to move from newline to beginning of following line)
Te6edf3startofline Tff7b72= Te6edf3skip_back_linesTb4b4b4(Te6edf3mmTb4b4b4, Te6edf3nTb4b4b4, Te6edf3startoflineTb4b4b4) Tff7b72+ T79c0ff1
T8b949e# Passing True to splitlines makes it return the list of lines without
T8b949e# removing the trailing newline (if any), so list mimics f.readlines()
T8b949e# return mm[startofline:endoflines].splitlines(True)
T8b949e# If Windows style \r\n newlines need to be normalized to \n
Tff7b72return Te6edf3mmTb4b4b4[Te6edf3startoflineTb4b4b4:Te6edf3endoflinesTb4b4b4]Tff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3osTff7b72.Td2a8fflinesepTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3sysTff7b72.Td2a8ffgetdefaultencodingTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Ta5d6ffbTa5d6ff'Tffea00\nTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8fftailTb4b4b4(Te6edf3f_nameTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4:
T8b949e"""
Return the last n lines of a given file name, f_name.
Akin to `tail -<n> <f_name>`
"""
Tff7b72def Td2a8ffdecodeTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3bTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3encodingTb4b4b4)
Te6edf3encoding Tff7b72= Te6edf3sysTff7b72.Td2a8ffgetdefaultencodingTb4b4b4(Tb4b4b4)
Te6edf3lines Tff7b72= Tffa657mapTb4b4b4(Te6edf3decodeTb4b4b4, Te6edf3_tailTb4b4b4(Te6edf3f_nameTff7b72=Te6edf3f_nameTb4b4b4, Te6edf3nTff7b72=Te6edf3nTb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────